home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-04-03 | 11.8 KB | 460 lines | [TEXT/MPS ] |
- //----------------------------------------------------------------------------------------
- // UCPlusTool.cp
- // Copyright © 1988-96 by Apple Computer, Inc. All rights reserved.
- //----------------------------------------------------------------------------------------
-
- #ifndef __UCPLUSTOOL__
- #include "UCPlusTool.h"
- #endif
-
- // MacApp
-
- #ifndef __UASSOCIATION__
- #include "UAssociation.h"
- #endif
-
- #ifndef __UCOREGLOBALS__
- #include "UCoreGlobals.h"
- #endif
-
- #ifndef __UCOREUTILITIES__
- #include "UCoreUtilities.h"
- #endif
-
- #ifndef __UNIVERSALSTARTUP__
- #include "UniversalStartup.h"
- #endif
-
- // Toolbox
-
- #ifndef __CURSORCTL__
- #include <CursorCtl.h>
- #endif
-
- #ifndef __ERRMGR__
- #include <ErrMgr.h>
- #endif
-
- #ifndef __FONTS__
- #include <Fonts.h>
- #endif
-
- #ifndef __RESOURCES__
- #include <Resources.h>
- #endif
-
- // ANSI
-
- #ifndef __SIGNAL__
- #include <signal.h>
- #endif
-
- #ifndef __STDIO__
- #include <stdio.h>
- #endif
-
- #ifndef __STDLIB__
- #include <stdlib.h>
- #endif
-
- //========================================================================================
- // GLOBAL Variables
- //========================================================================================
-
- #if !defined(__MWERKS__)
- QDGlobals qd;
- #endif
-
- // Global variables defined so that storage is allocated:
- const char* gCPlusToolVersion = "1.0";
- const char* kErrorMarker = "### ";
- TCPlusTool* gCPlusTool;
-
- //========================================================================================
- // GLOBAL Procedures
- //========================================================================================
- extern "C" void Intr(int);
-
- #undef Inherited
-
- //----------------------------------------------------------------------------------------
- // InitUCPlusTool:
- //----------------------------------------------------------------------------------------
- #pragma segment TInit
-
- void InitUCPlusTool()
- {
- // Do Tool related initialization
- InitGraf(&qd.thePort);
- SetFScaleDisable(TRUE); // per chapter in MPW guide on tools
-
- InitCursorCtl(NULL);
- RotateCursor(0);
-
- InitErrMgr("", "", FALSE);
-
- // -1 == 0xFFFFFFFF, the largest 32 bit address. Our routine StripLong uses a
- // pre-stripped address gStrippedAddress to avoid the yucky MPW glue.
-
- gStrippedAddress = StripAddress((Ptr) -1);
-
- // Find out just what kind of environment we're dealing with here
- if (!ValidateProcessor())
- ; // do something
- if (!ValidateConfiguration())
- ; // do something
-
- // The refnum where the application's resources should be found
- gApplicationRefNum = MACurResFile();
-
- gToolBoxInitialized = TRUE;
-
- // Do Object related initialization
- gSizeObjectHeap = 32000;
- gSizeHeapIncrement = 32000;
-
- InitUObject();
- } // InitUCPlusTool
-
-
- //----------------------------------------------------------------------------------------
- // Intr:
- //----------------------------------------------------------------------------------------
- #pragma segment TRes
-
- void Intr(int)
- {
- gCPlusTool->fInterrupted = TRUE; // we test this switch periodically
- } // Intr
-
-
- //========================================================================================
- // CLASS TCPlusTool
- //========================================================================================
- #undef Inherited
- #define Inherited TObject
-
- #pragma segment TInit
- MA_DEFINE_CLASS_M1(TCPlusTool, Inherited);
-
- //----------------------------------------------------------------------------------------
- // TCPlusTool::Stop:
- //----------------------------------------------------------------------------------------
- #pragma segment TRes
-
- void TCPlusTool::Stop(const CStr255& msg)
- {
- if (msg.Length() > 0)
- fprintf(stderr, "\n%s\n", (const char*)msg);
-
- if (fInterrupted)
- exit(-9);
-
- // don't worry about closing the files we opened. The Shell will do so if appropriate.
- exit((short)fRetCode); // exit, returning the appropriate status code
- } // TCPlusTool::Stop
-
- //----------------------------------------------------------------------------------------
- // TCPlusTool::SyntaxError:
- //----------------------------------------------------------------------------------------
- #pragma segment TInit
-
- void TCPlusTool::SyntaxError(const CStr255& suffix)
- {
- CStr255 aStr = fProgName;
-
- fprintf(stderr, "%s Bad Parameter: %s\n", kErrorMarker, (const char*)suffix);
- fprintf(stderr, "%s %s<invalid option>\n", kErrorMarker, (const char*)aStr);
- Stop("");
- } // TCPlusTool::SyntaxError
-
- //----------------------------------------------------------------------------------------
- // TCPlusTool::DoShowUsage:
- //----------------------------------------------------------------------------------------
- #pragma segment TInit
-
- void TCPlusTool::DoShowUsage()
- {
- fprintf(stderr, "# Usage: %s [-p]\n", (const char*)fProgName);
- } // TCPlusTool::DoShowUsage
-
- //----------------------------------------------------------------------------------------
- // TCPlusTool::GetNextArg:
- //----------------------------------------------------------------------------------------
- #pragma segment TInit
-
- void TCPlusTool::GetNextArg(CStr255& nextArg)
- {
- if (++fArgvIndex > fArgc)
- Stop(" Not enough arguments ");
- nextArg = fArgv[fArgvIndex];
- } // TCPlusTool::GetNextArg
-
- //----------------------------------------------------------------------------------------
- // TCPlusTool::InstallKeyWords:
- //----------------------------------------------------------------------------------------
- #pragma segment TInit
-
- void TCPlusTool::InstallKeyWords()
- {
- KeyWordStruct keywords [] =
- {
- {"Help", kwHelp},
- {"P", kwP}, {"NoP", kwNoP},
- {"T", kwT}, {"NoT", kwNoT}
- };
-
- for (short i = 0; i < sizeof(keywords) / sizeof(KeyWordStruct); i++)
- InstallKeyWord(keywords[i].keyword, keywords[i].keyvalue);
- } // TCPlusTool::InstallKeyWords
-
- //----------------------------------------------------------------------------------------
- // TCPlusTool::InstallKeyWord:
- //----------------------------------------------------------------------------------------
- #pragma segment TInit
-
- void TCPlusTool::InstallKeyWord(const CStr255& keyword,
- short kw)
- {
- CStr255 upperKeyWord(keyword);
- UprStr255(upperKeyWord);
-
- fKeyWordList->InsertEntry(upperKeyWord, (unsigned short)kw);
- } // TCPlusTool::InstallKeyWord
-
- //----------------------------------------------------------------------------------------
- // TCPlusTool::LookupKeyword:
- //----------------------------------------------------------------------------------------
- #pragma segment TInit
-
- Boolean TCPlusTool::LookupKeyword(const CStr255& keyword,
- short& kw)
- {
- Boolean returnVal = FALSE;
-
- CStr255 upperKeyWord(keyword);
- UprStr255(upperKeyWord);
-
- CStr255 value;
- if (fKeyWordList->ValueAt(upperKeyWord, value))
- {
- kw = value.ToUShort();
- returnVal = TRUE;
- }
-
- return returnVal;
- } // TCPlusTool::LookupKeyword
-
- //----------------------------------------------------------------------------------------
- // TCPlusTool::ProcessArg:
- //----------------------------------------------------------------------------------------
- #pragma segment TInit
-
- void TCPlusTool::ProcessArg(const CStr255& arg)
- {
- if (arg[1] != '-')
- DoProcessFileArg(arg);
- else
- {
- short akw;
- CStr255 realArg(arg);
-
- realArg.Delete(1,1); // delete the '-'
- if (LookupKeyword(realArg, akw))
- DoProcessOptionArg(akw);
- else
- SyntaxError(arg + " < invalid option > ");
- }
- } // TCPlusTool::ProcessArg
-
- //----------------------------------------------------------------------------------------
- // TCPlusTool::DoProcessFileArg:
- //----------------------------------------------------------------------------------------
- #pragma segment TInit
-
- void TCPlusTool::DoProcessFileArg(const CStr255& arg)
- {
- SyntaxError(arg + " < invalid option > ");
- } // TCPlusTool::DoProcessFileArg
-
- //----------------------------------------------------------------------------------------
- // TCPlusTool::DoProcessOptionArg:
- //----------------------------------------------------------------------------------------
- #pragma segment TInit
-
- void TCPlusTool::DoProcessOptionArg(short kw)
- {
- switch (kw)
- {
- case kwP:
- fProgress = TRUE;
- break;
- case kwNoP:
- fProgress = FALSE;
- break;
- case kwT:
- fTime = TRUE;
- break;
- case kwNoT:
- fTime = FALSE;
- break;
- case kwHelp:
- DoShowUsage();
- fRetCode = RC_Normal;
- Stop(" ");
- break;
- default:
- SyntaxError(CStr255(fArgv[fArgvIndex]) + CStr255(" < invalid option > "));
- }
- } // TCPlusTool::DoProcessOptionArg
-
- //----------------------------------------------------------------------------------------
- // TCPlusTool::DoStartProgress:
- //----------------------------------------------------------------------------------------
- #pragma segment TInit
-
- void TCPlusTool::DoStartProgress()
- {
- fprintf(stderr, "\n%s (Ver %s) \n\n\n", (const char*)fProgName, gCPlusToolVersion);
- } // TCPlusTool::DoStartProgress
-
- //----------------------------------------------------------------------------------------
- // TCPlusTool::DoToolAction
- //----------------------------------------------------------------------------------------
- #pragma segment TRes
-
- void TCPlusTool::DoToolAction()
- {
- SubClassResponsibility();
- } // TCPlusTool::DoToolAction
-
- //----------------------------------------------------------------------------------------
- // TCPlusTool constructor
- //----------------------------------------------------------------------------------------
- #pragma segment TInit
-
- TCPlusTool::TCPlusTool()
- {
- fArgc = 0;
- fArgv = NULL;
- fArgvIndex = 0;
- fCursorCount = 0; // prepare to spin that cursor
- fInterrupted = FALSE; // becomes true when interrupted
- fKeyWordList = NULL; // keywords to this command
- fProgress = FALSE;
- fRetCode = RC_Normal;
- fStartDateTime = 0; // Date/Time at start of tool
- fStartTicks = 0; // tickcount at start of tool
- fTime = FALSE;
- } // TCPlusTool::TCPlusTool
-
- //----------------------------------------------------------------------------------------
- // TCPlusTool destructor
- //----------------------------------------------------------------------------------------
- #pragma segment MADestructorRes
-
- TCPlusTool::~TCPlusTool()
- {
- }
-
- //----------------------------------------------------------------------------------------
- // TCPlusTool::ICPlusTool:
- //----------------------------------------------------------------------------------------
- #pragma segment TInit
-
- void TCPlusTool::ICPlusTool(int argc, char** argv)
- {
- IObject();
-
- gCPlusTool = this;
-
- fArgc = argc;
- fArgv = argv;
-
- fStartTicks = TickCount();
-
- unsigned long theDateTime;
- GetDateTime(&theDateTime);
- fStartDateTime = theDateTime;
-
- SpinCursor(1);
- signal(SIGINT, &Intr);
-
- fProgName = argv[fArgvIndex];
- fRetCode = RC_ParmErrs;
-
- if (fInterrupted)
- Stop("");
-
- FailInfo fi;
- Try(fi)
- {
- TAssociation* anAssociation = new TAssociation;
- anAssociation->IAssociation();
- fKeyWordList = anAssociation;
- fi.Success();
- }
- else
- {
- Free();
- fi.ReSignal();
- }
-
- InstallKeyWords();
- } // TCPlusTool::ICPlusTool
-
- //----------------------------------------------------------------------------------------
- // TCPlusTool::Run:
- //----------------------------------------------------------------------------------------
- #pragma segment TRes
-
- void TCPlusTool::Run()
- {
- FailInfo fi;
- Try(fi)
- {
- while (++fArgvIndex < fArgc) // fArgc is the number of args plus one
- {
- RotateCursor(++fCursorCount);
- ProcessArg(fArgv[fArgvIndex]);
- }
-
- UnloadSeg(&InitUCPlusTool);
- fRetCode = RC_Normal;
-
- if (fProgress)
- DoStartProgress();
-
- DoToolAction();
-
- if (fTime)
- {
- long currentTicks = TickCount();
- long elapsedTicks = currentTicks - fStartTicks;
- long double elapsedSecs = (double)elapsedTicks / 60.0;
- fprintf(stderr, "Elapsed time: %-1.2Lf seconds\n", elapsedSecs);
- }
-
- fi.Success();
- }
- else
- {
- OSErr theErr = fi.error;
- CChar255 theText;
-
- if (theErr != noErr)
- {
- GetSysErrText(theErr, theText);
- fprintf(stderr, "%s %s: %s\n", kErrorMarker, (const char*)fProgName, theText);
- fRetCode = RC_Abort;
- }
- }
-
- exit((short)fRetCode);
- } // TCPlusTool::Run
-
- //----------------------------------------------------------------------------------------
- // End of UCPlusTool.cp
-
- #pragma segment Inline
-